export const DUTY_CHAIN_NEXT_RESULT = "NEXT_CHAIN"
/**
 * 创建职责链链条
 * @param {Object} fn 链条方法
 */
let DutyChain = function(fn) {
	this.fn = fn;
	this.nextChain = null;
}

/**
 * 插入下一链条职责
 * @param {Object} nextChain 下一链条
 */
DutyChain.prototype.setNextChain = function(nextChain) {
	return this.nextChain = nextChain;
}

/**
 * 执行链条职责
 */
DutyChain.prototype.passRequest = function() {
	let result = this.fn.apply(this, arguments); // 执行
	// 执行结果 如果 == DUTY_CHAIN_NEXT_RESULT，执行下一链条，如果不是，返回执行结果
	return result != DUTY_CHAIN_NEXT_RESULT ? result : this.nextChain && this.nextChain.passRequest.apply(this
		.nextChain, arguments);
}

/**
 * 手动触发下一链条，异步职责链无法同步返回执行结果时，在结果回调中手动调用该方法执行下一链条
 */
DutyChain.prototype.next = function() {
	return this.nextChain && this.nextChain.passRequest.apply(this.nextChain, arguments);
}

export default DutyChain;
